<?php

include_once 'model/conn.php';
include_once 'model/dbm.php';
include_once 'model/dbm.orm.php';
include_once 'model/util.php';
include_once 'util_gen.php';
include_once 'gerar.php';
include_once 'gerar/visualizar.php';
include_once 'gerar/detalhes.php';
include_once 'gerar/editar.php';

class gen {

    protected $c;
    protected $r;
    protected $tabelas_selecionadas = array();

    public function __construct() {
        $this->c = model_conn::get_conn();
        $this->r = $this->c->getDatabaseInfo();
        echo "<h2>Gerador</h2>";
    }

    public function form($passo) {
        $r = '<form method="post" action="gen.php">';
        if ($passo == 1) {
            $r.= $this->passo1();
        } else if ($passo == 2) {
            $r.= $this->passo2();
        } else if ($passo == 3) {
            $r.= $this->passo3();
        }

        $r.= '</form>';
        echo $r;
    }

    protected function passo1() {
        $r = '
            
<form method="post" action="gen.php">

<input type=hidden name=passo1 value=enviado />

Prefixo CRUD geral: 
  <input name="prefixo_crud_geral" type="text" value="visao_pagina_conteudo_" size="50" />';


        $r.= $this->sufixos();
        $r.= $this->tabela_gerar_crud();

        $r.= '<input type="submit" value="Passo 2 - definir campos para visualizar" />';

        $r.= '</form>';

        return $r;
    }

    protected function passo2() {
        //echo 'p2';

        $r = '';


        $r.= '<input type=hidden name=passo2 value=enviado />';

        foreach ($_POST as $k => $v) {

            $r.= '
            
<input type="hidden" name="' . $k . '" value="' . $v . '" />';
        }

        $tabelas = array();

        foreach ($_POST as $k => $v) {
            //echo "<b>$k</b> = $v<br>";


            $got_found = preg_match('/^gerar_crud_tabela_(.+)$/', $k, $matches);

            if ($got_found) {
                $tab_caminho = array();
                $tabela = $matches[1];

                $caminho = util::POST('prefixo_crud_geral') . util::POST('caminho_crud_tabela_' . $tabela);

                $tab_caminho['tabela'] = $tabela;
                $tab_caminho['prefixo_caminho_crud'] = $caminho;

                array_push($this->tabelas_selecionadas, $tabela);

                array_push($tabelas, $tab_caminho);
            }
        }
        //print_r($tabelas);


        $r.= '<table border="1" cellspacing="0" cellpadding="4">
            <tr>
    <td colspan="2" valign="top"><strong>Campo visualizar</strong></td>
    </tr>';


        foreach ($this->r as $tables) {
            foreach ($tables as $table => $columns) {
                if (in_array($table, $this->tabelas_selecionadas)) {
                    $r.= $this->passo2_campos_tabela($table);
                }
            }
        }
        $r.= '</table>
            <input type="submit" value="Passo 3 - Gerar arquivos" />';


        return $r;
    }

    protected function passo3() {


        $r = '';


        foreach ($_POST as $k => $v) {

            $r.= '
            
<input type="hidden" name="' . $k . '" value="' . $v . '" />';
        }

        foreach ($_POST as $k => $v) {
            //echo "<b>$k</b> = $v<br>";


            $got_found = preg_match('/^gerar_crud_tabela_(.+)$/', $k, $matches);

            if ($got_found) {
                $tab_caminho = array();
                $tabela = $matches[1];

                $caminho = util::POST('prefixo_crud_geral') . util::POST('caminho_crud_tabela_' . $tabela);

                $tab_caminho['tabela'] = $tabela;
                $tab_caminho['prefixo_caminho_crud'] = $caminho;

                array_push($this->tabelas_selecionadas, $tabela);
            }
        }

        
        // apagando o diretório:
        util_gen::rmdir(util_gen::$diretorio_saida);
        
        // classe visão:
        util_gen::cria_arquivo('', 'visao.php', gerar::classeVisao());
        
        // include:
        util_gen::cria_arquivo('', 'include.php', $this->getInclude());
        
        // CONTEÚDO:
        util_gen::cria_arquivo('visao/pagina/', 'conteudo.php', $this->getArquivoConteudo());
        
        
        //CRUD:
        foreach ($this->r as $tables) {
            foreach ($tables as $table => $columns) {
                if (in_array($table, $this->tabelas_selecionadas)) {
                    $v = new gerar_visualizar();
                    $v->setTabela($table);

                    $campos_tabela_visualizar = $this->getCamposTabelaVisualizar($table);

                    foreach ($campos_tabela_visualizar as $campo) {
                        $v->adicionarCampo($campo);
                    }

                    $caminho = $this->getCaminhoClasse($table);
                    $v->setNomeClasse($caminho, util::POST('sufixo_visualizar'));
                    
                    $caminho = util_gen::get_caminho($caminho);
                    
                    
                    
                    util_gen::cria_arquivo($caminho, 'visualizar.php', $v->getResultado());
                    
                    
                    // ------- DETALHES
                    
                    $campos_detalhes = $this->getTodosCamposTabela($table);
                    $detalhes = new gerar_detalhes();
                    $detalhes->setTabela($table);
                    foreach ($campos_detalhes as $campo) {
                        $detalhes->adicionarCampo($campo);
                    }
                    $caminho = $this->getCaminhoClasse($table);
                    $detalhes->setNomeClasse($caminho, util::POST('sufixo_detalhes'));
                    
                    $caminho = util_gen::get_caminho($caminho);
                    
                    
                    util_gen::cria_arquivo($caminho, 'detalhes.php', $detalhes->getResultado());
                    
                    
                    // --------- EDITAR
                    
                    $editar = new gerar_editar();
                    $editar->setTabela($table);
                    
                    $caminho = $this->getCaminhoClasse($table);
                    $editar->setNomeClasse($caminho, util::POST('sufixo_alterar'));
                    
                    $caminho = util_gen::get_caminho($caminho);
                    
                    
                    util_gen::cria_arquivo($caminho, 'editar.php', $editar->getResultado());
                    
                }
            }
        }

        return $r;
    }
    
    protected function getArquivoConteudo() {
        $r=  '<?php

class visao_pagina__conteudo implements modelo_interface_visao {

    protected $conteudo = NULL;

    public function __construct() {


	if (util::acao_GET_is("inicio")) {
	    $this->conteudo = new visao_pagina_conteudo_inicio();
	}
        
';
        
        
        
        
        
        
        foreach ($this->r as $tables) {
            foreach ($tables as $table => $columns) {
                if (in_array($table, $this->tabelas_selecionadas)) {
                    
                    
                    $caminho = $this->getCaminhoClasse($table);
                    $r.= "
                    if (util::acao_GET_is(\"$table.detalhes\")) {
	    \$this->conteudo = new $caminho".util::POST('sufixo_detalhes')."();
	}";
                    
                    
                    
                    $caminho = $this->getCaminhoClasse($table);
                    $r.= "
                    if (util::acao_GET_is(\"$table.visualizar\")) {
	     \$this->conteudo = new $caminho".util::POST('sufixo_visualizar')."();
	}";
                    
                    
                    
                    $caminho = $this->getCaminhoClasse($table);
                    $r.= "
                    if (util::acao_GET_is(\"$table.editar\")) {
	     \$this->conteudo = new $caminho".util::POST('sufixo_alterar')."();
	}";
                    
                }
            }
        }
        
        
        
        
        
        $r.= '



    }

    public function render() {
	if ($this->conteudo === NULL) {
	    $this->conteudo = new visao_pagina_conteudo_cliente_visualizar();
	}
	$this->conteudo->render();
    }

}
?>';
        return $r;
    }


    protected function getInclude() {
        $r = "<?php

//require_once 'model/conn.php';
//require_once 'model/data.php';
//require_once 'model/dbm.php';
//require_once 'model/dbm.orm.php';
require_once 'model/interface/visao.php';
require_once 'model/post.php';
require_once 'model/tabela.php';
require_once 'model/tabela_vertical.php';
require_once 'model/sessao.php';
require_once 'model/util.php';
require_once 'model/form_select.php';
require_once 'model/upload.php';
require_once 'model/resize.php';
require_once 'model/error_handler.php';
require_once 'model/entidade/entities.php';

require_once 'control/sessao.php';


require_once 'view/login.php';
require_once 'view/pagina.php';
require_once 'view/pagina/menu.php';
require_once 'view/pagina/conteudo.php';
require_once 'visao.php';

";
        
        
        
        foreach ($this->r as $tables) {
            foreach ($tables as $table => $columns) {
                if (in_array($table, $this->tabelas_selecionadas)) {
                    $caminho = $this->getCaminhoClasse($table);
                    $caminho = util_gen::get_caminho($caminho);
       
                    
                    
                    //$r.= "\nrequire_once '{$caminho}".util::POST('sufixo_incluir').".php';";
                    $r.= "\nrequire_once '{$caminho}".util::POST('sufixo_visualizar').".php';";
                    $r.= "\nrequire_once '{$caminho}".util::POST('sufixo_alterar').".php';";
                    //$r.= "\nrequire_once '{$caminho}".util::POST('sufixo_excluir').".php';";
                    $r.= "\nrequire_once '{$caminho}".util::POST('sufixo_detalhes').".php';\n";
                    
                }
            }
        }
        
        
        
        $r.= "
            
?>";
        return $r;
    }

    protected function getCaminhoClasse($tabela) {
        foreach ($_POST as $k => $v) {
            $got_found = preg_match('/^gerar_crud_tabela_(.+)$/', $k, $matches);

            if ($got_found) {
                $tabela_achada = $matches[1];

                if ($tabela_achada == $tabela) {
                    $caminho = util::POST('prefixo_crud_geral') . util::POST('caminho_crud_tabela_' . $tabela);

                    return $caminho;
                }
            }
        }
        return 'NÃO ENCONTRADO.';
    }

    protected function getCamposTabelaVisualizar($tabela) {

        $campos = array();

        foreach ($_POST as $k => $v) {
            $campo = preg_replace('/_EASYADMINCAMPO_/', '(EASYADMINCAMPO)', $k);
            $campo = preg_replace('/_EASYADMINTABELA_/', '(EASYADMINTABELA)', $campo);

            $achou = preg_match('/^exibir\(EASYADMINCAMPO\)([^\(]+)\(EASYADMINTABELA\)(.+)$/', $campo, $matches);
            if ($achou) {
                if ($matches[2] == $tabela) {
                    array_push($campos, $matches[1]);
                }
            }
        }
        return $campos;
    }
    
    protected function getTodosCamposTabela($tabela) {
        
        $campos = array();
        
        foreach ($this->r as $tables) {
            foreach ($tables as $table => $columns) {
                if ($table == $tabela) {

                    foreach ($columns as $column => $column_info) {
                        array_push($campos, $column);
                    }
                }
            }
        }
        return $campos;
    }

    protected function sufixos() {
        $r = '<table border="1" cellspacing="0" cellpadding="4">
  <tr>
    <td colspan="2"><strong>Sufixos</strong></td>
    </tr>
  <tr>
    <td>Incluir:</td>
    <td><input name="sufixo_incluir" type="text" value="incluir" /></td>
  </tr>
  <tr>
    <td>Visualizar:</td>
    <td><input name="sufixo_visualizar" type="text" value="visualizar" /></td>
  </tr>
  <tr>
    <td>Alterar:</td>
    <td><input name="sufixo_alterar" type="text" value="alterar" /></td>
  </tr>
  <tr>
    <td>Excluir:</td>
    <td><input name="sufixo_excluir" type="text" value="excluir" /></td>
  </tr>
  <tr>
    <td>Detalhes:</td>
    <td><input name="sufixo_detalhes" type="text" value="detalhes" /></td>
  </tr>
</table>';
        return $r;
    }

    protected function tabela_gerar_crud() {
        $r = "";

        $r.= '<table border="1" cellspacing="0" cellpadding="4">
            <tr>
    <td nowrap="nowrap"><strong>Gerar CRUD</strong></td>
    <td nowrap="nowrap"><strong>Tabela</strong></td>
    <td nowrap="nowrap"><strong>Prefixo das classes</strong></td>
  </tr>';




        foreach ($this->r as $tables) {
            foreach ($tables as $table => $columns) {


                $r.= '<tr>
    <td align="right"><input 
    name="gerar_crud_tabela_' . $table . '" 
        type="checkbox" checked="checked" /></td>
    <td>' . $table . '</td>
    <td><input 
    name="caminho_crud_tabela_' . $table . '" 
    type="text" value="' . $table . '_" size="50" /></td>
  </tr>';
            }
        }


        $r.= "</table>";
        return $r;
    }

    protected function passo2_campos_tabela($tabela) {
        $r = '';

        $r.= '<tr>
    <td valign="top">Tabela ' . $tabela . '</td>
    <td valign="top">
        <table border="1" cellspacing="0" cellpadding="4">
      <tr>
        <td><strong>Exibir</strong></td>
        <td><strong>Campo</strong></td>
        </tr>';


        foreach ($this->r as $tables) {
            foreach ($tables as $table => $columns) {
                if ($table == $tabela) {

                    foreach ($columns as $column => $column_info) {

                        $r.= '<tr>
        <td><input name="exibir_EASYADMINCAMPO_' . $column . '_EASYADMINTABELA_' . $table . '" type="checkbox" checked="checked" /></td>
        <td>' . $column . '</td>
        </tr>';
                    }
                }
            }
        }

        $r.= '
      </table></td>
  </tr>';

        return $r;
    }

}

$gen = new gen();

if (util::POST_isset('passo2')) {
    // enviou passo 2.
    $gen->form(3);
} else if (util::POST_isset('passo1')) {
    // enviou passo 1.
    $gen->form(2);
} else {
    $gen->form(1);
}

//util_gen::cria_diretorio('./resultado/' . util_gen::get_caminho('view_pagina_conteudo_agrupamento'));
?>